package MyCircularQueue;

public class MyCircularQueue {
//    //浪费一个空间
//    public int[] arr;
//
//    public int front;//头
//    public int tail;//尾
//
//    public MyCircularQueue(int k) {
//        this.arr = new int[k + 1];
//    }
//
//    public boolean enQueue(int value) {
//        if (isFull()) {
//            return false;
//        }
//
//        this.arr[tail] = value;
//        tail = (tail + 1) % arr.length;
//        return true;
//    }
//
//    public boolean deQueue() {
//        if (isEmpty()) {
//            return false;
//        }
//
//        front = (front + 1) % arr.length;
//        return true;
//    }
//
//    public int Front() {
//        if (isEmpty()) {
//            return -1;
//        }
//        return arr[front];
//    }
//
//    public int Rear() {
//        if (isEmpty()) {
//            return -1;
//        }
//        int index = (tail == 0) ? arr.length - 1 : tail - 1;
//        return arr[index];
//    }
//
//    public boolean isEmpty() {
//        return tail == front;
//    }
//
//    public boolean isFull() {
//        return (tail + 1) % arr.length == front;
//    }

    public int[] arr;
    public int front;
    public int tail;
    public int usedSize;

    public MyCircularQueue(int k) {
        this.arr = new int[k];
    }

    public boolean enQueue(int value) {
        if (isFull()) {
            return false;
        }

        arr[tail] = value;
        this.usedSize++;
        tail = (tail + 1) % arr.length;
        return true;
    }

    public boolean deQueue() {
        if (isEmpty()) {
            return false;
        }

        front = (front + 1) % arr.length;
        this.usedSize--;
        return true;
    }

    public int Front() {
        if (isEmpty()) {
            return -1;
        }

        return arr[front];
    }

    public int Rear() {

        if (isEmpty()) {
            return -1;
        }

        int index = (tail == 0) ? arr.length - 1 : tail - 1;
        return arr[index];
    }

    public boolean isEmpty() {
        return this.usedSize == 0;
    }

    public boolean isFull() {
        return this.usedSize == arr.length;
    }
}
